package com.zjc615.config;

import com.zjc615.config.handler.TokenToMallUserMethodArgumentResolver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.util.List;

/**
 * 这是一个Spring MVC的配置类，用于配置Web应用的MVC相关功能。
 * 类实现了一个名为NeeBeeMallWebMvcConfigurer的配置类，
 * 并在其中定义了一个名为tokenToMallUserMethodArgumentResolver的TokenToMallUserMethodArgumentResolver对象。
 * TokenToMallUserMethodArgumentResolver对象用于处理控制器方法中使用了@TokenToMallUser注解的参数
 */
@Configuration
public class NeeBeeMallWebMvcConfigurer extends WebMvcConfigurationSupport {

    @Autowired
    private TokenToMallUserMethodArgumentResolver tokenToMallUserMethodArgumentResolver;

    /**
     * TokenToMallUser 注解处理方法
     * 当Spring MVC框架调用控制器方法时，就会首先判断控制器方法的参数是否使用了@TokenToMallUser注解，
     * 如果是，则将使用tokenToMallUserMethodArgumentResolver对象进行解析。
     *
     * @param argumentResolvers
     * @tip @TokenToMallUser @TokenToAdminUser 注解处理方法
     */
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(tokenToMallUserMethodArgumentResolver);
    }

    /**
     * 用于配置Spring MVC中的资源处理器
     * 防止出现 No mapping for GET /null/swagger-resources/configuration/ui 等情况
     * @param registry
     */
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 调用addResourceHandler("/**")方法，我们指定了一个URL模式/**，表示所有匹配该模式的请求都将被映射到/相关的资源
        // 调用addResourceLocations("classpath:/static/")方法，我们指定了资源文件的位置
        registry.addResourceHandler("/**").addResourceLocations(
                "classpath:/static/");
        registry.addResourceHandler("swagger-ui.html").addResourceLocations(
                "classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations(
                "classpath:/META-INF/resources/webjars/");
        super.addResourceHandlers(registry);
    }

    /**
     * 跨域配置
     *
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                .exposedHeaders("access-control-allow-headers",
                        "access-control-allow-methods",
                        "access-control-allow-origin",
                        "access-control-max-age",
                        "X-Frame-Options")
                .allowCredentials(false).maxAge(3600);
        super.addCorsMappings(registry);
    }
}
